Решето Эратосфена — алгоритм нахождения всех простых чисел до некоторого целого числа n. Сложность алгоритма равна O(nlog(logn)).
Суть алгоритма заключается в том, чтобы поэтапно исключать из набора чисел от 2 до n числа, делящиеся на 2(кроме 2), 3(кроме 3), 5(кроме 5) и так далее. Мы не будем искать числа, которые делятся на 4, 6, 8, 9 и так далее, потому что мы их уже исключили ранее.
Для реализации алгоритма нам понадобится массив размера n. Индекс массива будет равен числу, а значение массива с этим индексом будет определять простое число или нет. Изначально инициализируем все элементы массива как простые числа. Далее начинаем поэтапно исключать составные числа, которые делятся на i. В строке 12 мы начинаем с i * i, так как до значения i * i мы уже отобрали простые числа. Допустим i = 5, тогда j может принимать значения от 10 до n с шагом 5, но нам не нужно проверять числа 2 * 5, 3 * 5, 4 * 5, так как мы их уже исключили когда i было равно 2, 3 и 4 соответственно. Другими словами все меньшие числа, кратные i, обязательно имеют простой делитель меньше i, а они уже исключены к этому времени. Так как минимальное исключенное число для i будет i * i, то внешний цикл делаем с границей i < sqrt(n) или i * i < n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n, i, j, k; int A[1000] = { 0 }; scanf("%i", &n); for (i = 2; i * i <= n; i++) { if (A[i] == 0) { for (j = i * i; j <= n; j += i) { A[j] = 1; } } } for (i = 2; i <= n; i++) { if (A[i] == 0) { printf("%i ", i); } } return 0; }
Данный алгоритм выводит все простые числа от 2 до n включительно.
Для лучшего понимания можете посмотреть видео Тимофея Хирьянова на Ютубе.
Code.C
© Copyright Павел Калашников 2021
обратная связь code.c04@mail.ru